package com.boarsoft.boar.batch.service;

import com.boarsoft.bean.ReplyInfo;
import com.boarsoft.boar.batch.entity.BatchRegist;
import com.boarsoft.boar.batch.entity.BatchReport;

/**
 * @author tao.wang57
 * @Description: 批量执行上报服务接口
 * @date 2023-12-26
 */
public interface BatchReportService {

    /**
     * 批量执行进度上报_直接上报
     *
     * @param batchId  任务执行id
     * @param progress 执行进度，包括形如 +5，5 的增量上报和形如 |5| 的绝对上报
     *                      1）增量上报：如 5或者+5，表示在原有进度的基础上加5%的进度。此操作可理解为做加法操作。
     *                      2）绝对上报：如|60|将会覆盖调之前的进度，使整体进度为60%，此操作可理解为数据库中的update操作。
     * @param phrase   执行阶段
     * @param addr     执行端IP地址
     *
     * @return ReplyInfo.success("登记成功")
     */
    ReplyInfo<Object> report(String batchId, String progress, String phrase, String addr);

    /**
     * 批量执行进度上报_带状态的直接上报
     *
     * @param batchId  任务执行id
     * @param progress 执行进度，包括形如 +5，5 的增量上报和形如|5|的绝对上报
     *                      1）增量上报：如 5或者+5，表示在原有进度的基础上加5%的进度。此操作可理解为做加法操作。
     *                      2）绝对上报：如|60|将会覆盖调之前的进度，使整体进度为60%，此操作可理解为数据库中的update操作。
     * @param phrase   执行阶段
     * @param addr     执行端IP地址
     * @param errMsg   错误监息，如果当前阶段为正常执行，则此字段默认为null，产生中断异常监息时此字段需赋值为相监的异常对象或异常码等（不允许为空）
     *                 即调度中心根据此字段判断异常与否，null-无异常，成功；not null-失败，执行异常并中断
     *
     * @return  ReplyInfo.success("登记成功")
     */
    ReplyInfo<Object> report(String batchId, String progress, String phrase, String addr, Object errMsg);

    /**
     * 批量执行进度上报_详情上报时先上报子任务数、子任务数据量以及子任务占比
     *
     * @param batchId      任务执行id
     * @param phrase       执行阶段
     * @param addr         执行端IP地址
     * @param childern     子任务数  （如总共分500页等）
     * @param childDataVol 子任务数据量 （如数据量为100000条等）
     * @param percent      子任务占比
     *
     * @return ReplyInfo.success("登记成功");
     */
    ReplyInfo<Object> report(String batchId, String phrase, String addr, int childern, int childDataVol, int percent);

    /**
     * 批量执行进度上报_详情明细上报。（根据分页数计算执行占比）
     *  be dependent on：
     *  ReplyInfo<Object> report(String batchId, String phrase, String addr, int childern, int childDataVol, int percent);
     *
     * <h6>该方法由于根据分页上报计算进度，当分页执行失败时会漏掉统计本页已经执行成功的，因此对精度要求比较高的场景不推荐使用此方法</h6>
     *
     * @param batchId  任务执行id
     * @param progress 执行进度，一般表述子任务的完成个数，此字段赋值为1即可
     * @param phrase   执行阶段
     * @param addr     执行端IP地址
     * @param index    执行序号，如分页编号
     *
     * @return ReplyInfo.success("登记成功");
     */
    @Deprecated
    ReplyInfo<Object> report(String batchId, String progress, String phrase, String addr, String index);

    /**
     * 批量执行进度上报_详情明细上报。（根据上报记录数计算执行进度）
     *  be dependent on：
     *  ReplyInfo<Object> report(String batchId, String phrase, String addr, int childern, int childDataVol, int percent);
     *
     *
     * @param batchId   任务执行id
     * @param dealCount 当前页处理数据量，
     * @param phrase    执行阶段
     * @param addr      执行端IP地址
     * @param index     执行序号，如分页编号
     *
     * @return ReplyInfo.success("登记成功");
     */
    ReplyInfo<Object> report(String batchId, int dealCount, String phrase, String addr, String index);

    /**
     * 异常上报
     *
     * @param batchId 任务执行id
     * @param error   异常监息
     *
     * @return ReplyInfo.success("登记成功");
     */
    ReplyInfo<Object> report(String batchId, String error);

    /**
     * 异常上报，如分页任务执行异常时调用此接口上报异常监息
     *
     * @param batchId 任务执行id
     * @param index   任务执行id
     * @param error   异常监息
     *
     * @return ReplyInfo.success("登记成功");
     */
    ReplyInfo<Object> report(String batchId, String index, String error);

    /**
     * 子任务开始执行时调用，返回当前任务的状态，以及后续上报的识别号
     *
     * @param batchId
     *
     * @return ReplyInfo.success(Map<String, String>);
     */
    ReplyInfo<Object> report(String batchId);

    /**
     * 指令上报确认
     *
     * @param batchId
     *
     * @return ReplyInfo.SUCCESS
     */
    ReplyInfo<Object> cmdReport(String batchId, short cmd);

    /**
     * 批量开始执行时上报
     *
     * @param batchId 批次号
     * @param addr    执行机器IP地址
     * @param request 符合JSON字符串格式的入参对象
     * @param flowId  流程的flowId
     *
     * @return ReplyInfo.SUCCESS
     */
    ReplyInfo<Object> startReport(String batchId, String addr, String request, String flowId);

    /**
     * 任务执行登记（过期方法）
     *
     * @return
     */
    @Deprecated
    ReplyInfo<Object> executionRegist(BatchRegist executionRegist);

    /**
     * 任务执行进度上报（过期方法）
     *
     * @return
     */
    @Deprecated
    ReplyInfo<Object> executionReport(BatchReport executionReport);

    void sendMQ(String id, String batchId);

}
